#ifndef SIGNALING_H
#define SIGNALING_H

#include <QObject>
#include <QAbstractSocket>
#include <QJsonObject>
#include <QMap>
class QWebSocket;

#define KEY_JANUS               ("janus")
#define KEY_TRANSACTION         ("transaction")
#define KEY_PLUGINDATA          ("plugindata")
#define KEY_DATA                ("data")
#define KEY_VIDEO_ROOM          ("videoroom")

typedef std::function<void(const QJsonObject& data)> callBackFun;

class Signaling : public QObject
{
    Q_OBJECT
public:
    explicit Signaling(QObject *parent = nullptr);
    virtual ~Signaling();

    /**
     * @brief init 初始化
     */
    void init();

    /**
     * @brief connectToServer 链接到信令服务器
     * @param strServer 服务器地址
     */
    void connectToServer(const QString& strServer);

    void sendMsg(QJsonObject &msg);
    void sendMsg(QJsonObject &msg, const callBackFun& fun);

    void setSeeionID(const qint64& id);

    void setEventCallBack(const QString& strName, const callBackFun& func);
    void setNotifyCallBack(const QString& strName, const callBackFun& func);

Q_SIGNALS:
    void sigConnected();


public Q_SLOTS:
    void slotConnected();
    void slotDisConnected();
    void slotError(QAbstractSocket::SocketError error);
    void slotTextMessageReceived(const QString &message);


private:

    QString doSendMsg(QJsonObject& msg);
private:
    QWebSocket                          *m_pWebSocket;

    /* key:transaction 由PublicFunHelper::getRandomString创建
     * value：函数
     * 说明：该字段在向信令服务器发送消息时插入一个对象，在收到信令服务器返回的消息后，
     * 根据其中的transaction进行匹配，如果存在则进行函数调用，同时删除该key*/
    QMap<QString, callBackFun>          m_msgCallBacks;

    // 同上
    QMap<QString, callBackFun>          m_eventCallBacks;

    // 同上
    QMap<QString, callBackFun>          m_notifyCallBacks;

    qint64                              m_seeionID;
};

#endif // SIGNALING_H
